lexer grammar GDLLexer;

options {
  language = Java;
}

@lexer::header{
  package ejercicio8;
  import java.util.ArrayList;
}

@lexer::members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
}

fragment LLAVE_ABI : '{';
fragment LLAVE_CERR : '}'; 
fragment COMILLAS : '"';
fragment INICIO_COMEN : '//';
fragment NUEVA_LINEA : '\r' ? '\n';

BLANCO : (' '|'\t'|'\r'?'\n') {$channel=HIDDEN;};
COLON : ':';
LLAVE : LLAVE_ABI | LLAVE_CERR;
GRAPH : 'graph';
NODE : 'node';
EDGE : 'edge';
TITLE : 'title';
LABEL : 'label';
SOURCE : 'source';
TARGET : 'target';
ARROWSTYLE : 'arrowstyle';
BORDERSTYLE : 'borderstyle';

FLECHA : 'solid' | 'line' | 'none';
BORDE : 'solid' | 'dashed' | 'none' | 'dotted';

COMENTARIO: INICIO_COMEN (options {greedy=false;}:.)* NUEVA_LINEA {$channel=HIDDEN;};


fragment DIGITO : '0'..'9';
NUMERO : (DIGITO)+('.'(DIGITO)+)?;

fragment LETRA: ('A'..'Z')|('a'..'z')| 'á' | 'é';
IDENT : (LETRA)((DIGITO)|(LETRA))*;

CADENA : (COMILLAS)(LETRA | NUMERO | ' ')+ (COMILLAS);